/*
 * Message trans handling
 * (C) Nettle developers 2000-2001
 *
 * $Id: messages,v 1.8 2003/12/13 17:42:56 archifishal Exp $
 */

#include "generic.h"
#include "globals.h"

#include "messages.h"
#include "misc.h"

static int messagetrans_area[4];
static int *messagetrans_buffer;

void load_messages(void)
{
  char country[16];
  char messages_file_name[1024];
  FILE *file_handle;
  int size_of_messagetrans_buffer;

  /* Get the country - if it has null length, then default to UK */
  if (strlen(get_country(country, sizeof(country))) == 0)
    strcpy(country, "UK");

  /* put together filename */
  sprintf(messages_file_name, "<%s$Dir>.Resources.%s.Messages",
    application_name, country);

  /* open the file */
  file_handle = fopen(messages_file_name, "r");

  /* if we don't open it, then definitely set country to UK */
  if (file_handle == 0)
    strcpy(country,"UK");
  else
    fclose(file_handle);

  sprintf(messages_file_name, "<%s$Dir>.Resources.%s.Messages",
    application_name, country);

  /* Now re-open it */
  size_of_messagetrans_buffer = _swi(MessageTrans_FileInfo,
    _IN(1)|_RETURN(2), messages_file_name);

  messagetrans_buffer = malloc(size_of_messagetrans_buffer);
  assert(messagetrans_buffer != NULL);

  _swi(MessageTrans_OpenFile, _INR(0,2), messagetrans_area,
    messages_file_name, messagetrans_buffer);
}


void lose_messages(void)
{
  _swi(MessageTrans_CloseFile, _IN(0), messagetrans_area);
  free(messagetrans_buffer);
}


/* Looks up a messagetrans token, and writes to the buffer supplied */

char *lookup(const char *token, char *buffer, int buf_size)
{
  assert(token != NULL);
  assert(buffer != NULL);
  assert(buf_size > 0);

  if (_swix(MessageTrans_Lookup, _INR(0,3), messagetrans_area, token, buffer, buf_size))
    strncpy(buffer, token, buf_size - 1); /* error trap */

  return buffer;
}

/*
 * Description:  Look up a messagetrans token and return a pointer to
 *               it in the MessageTrans buffer.
 * Parameters:   token-> the token to look up
 * Returns:      NULL if not found; pointer to buffer entry if found
 */
char *lookup_inbuffer(const char *token)
{
  char *buffer;
  assert(token != NULL);

  if (_swix(MessageTrans_Lookup, _INR(0,2) | _OUT(2),
                                 messagetrans_area, token, NULL,
                                 &buffer))
    return NULL;

  return buffer;
}

/* Looks up a messagetrans token and puts it in a static buffer */

const char *lookup_static(const char *token)
{
  return lookup_static_sub(token, 0, 0);
}


/* Looks up a messagetrans token and puts it in a static buffer with substitution */

const char *lookup_static_sub(const char *token, int params, va_list va)
{
  static char buffer[256];
  int vars[4]={0,0,0,0};
  int pos=0;
  assert(token != NULL);
  assert(params < 5 );

  for(;params;params--, pos++)
    vars[pos]=(int) va_arg(va, char *);

  if (_swix(MessageTrans_Lookup, _INR(0,7), messagetrans_area, token, buffer, sizeof (buffer),
    vars[0], vars[1], vars[2], vars[3] ))
    strncpy (buffer, token, sizeof (buffer) - 1); /* error trap */

  return buffer;
}

/* Looks up a messagetrans token and puts it in a static buffer with substitution */

const char *lookup_static_var(const char *token, int params, ...)
{
  va_list va;
  const char *buffer;

  va_start(va, params);
  buffer=lookup_static_sub(token, params, va);
  va_end(va);

  return buffer;
}

